Skip to content

Development - #354

Open
IAnMove wants to merge 294 commits into
mainfrom
development
Open

Development#354
IAnMove wants to merge 294 commits into
mainfrom
development

Conversation

@IAnMove

@IAnMove IAnMove commented Sep 11, 2026

Copy link
Copy Markdown
Owner

Resumen ejecutivo

Esta primera sección está pensada para project managers y revisores no
técnicos. Mantén el detalle técnico completo más abajo.

Qué cambia

Para qué sirve

Impacto para el usuario

Riesgo

  • Bajo
  • Medio
  • Alto

Estado

  • En desarrollo
  • Listo para revisión
  • Bloqueado por CI o revisión
  • Requiere migración o acción manual

Summary

Overview

Detailed changes

Backend

UI and Wizard

Data, provenance and compatibility

Files and ownership

Validation

  • Date (UTC):

  • Base SHA:

  • Head SHA:

  • Validation scope: focused / fast / CI-equivalent (--full) / real smoke

  • python scripts/verify_clean_repo.py

  • python -m compileall -q app/services app/launch.py scripts

  • Focused Python tests:

  • cd ui && npm run i18n:check

  • UI tests:

  • cd ui && npm run lint -- --max-warnings=0

  • cd ui && npm run build

  • git diff --check

  • E2E/smoke checks:

Code quality

  • Score: pending CI
  • Complexity trend: pending CI
  • Production LOC trend: pending CI
  • Regression versus main: pending CI
  • Ratchet: pending CI

CI and review

Mutable CI/Cursor facts belong in this PR body. Updating them does not
require a new documentary commit. Stable behavior evidence belongs in docs.

  • CI of this HEAD: pending
  • Independent agent review of this HEAD: pending
  • Human merge click (operational, not code review): pending

Cursor/Bugbot — pick exactly one. A review of an older SHA does not cover a
new HEAD. Silence is not approval. If required QA is missing, use another
authorized agent or leave pending; do not assume a human code review will
substitute.

  • Reviewed at current HEAD
  • Earlier review; HEAD has changed since (stale)
  • Pending
  • Unavailable

Coste de la tarea

  • Tests simulados: 0 tokens externos
  • Tests reales: N/A
  • Llamadas LLM externas: 0
  • Tokens de prompt: N/A
  • Tokens de respuesta: N/A
  • Tokens totales: N/A
  • Generaciones de imágenes/audio/vídeo: 0
  • Tiempo transcurrido: N/A
  • Proveedores/modelos: N/A

Notes and limitations

Follow-up work

Checklist

  • The executive summary is understandable without reading the code.
  • The detailed Summary/Overview has not been removed or shortened.
  • Tests and their actual results are recorded.
  • Generated assets, secrets and local-only files are not committed.
  • Required CI and Cursor/Bugbot review are complete, or the PR is clearly
    marked as waiting for them.

Note

High Risk
Changes span _launch_runtime Series render gating, a new macOS server profile with divergent MCP/capability behavior, and CI test sharding that could miss tests if grouping drifts.

Overview
This is a broad integration pass across CI, platform profiles, Series Lab production, Wizard/MCP, and character speech assets.

CI splits the former monolithic Python test job into two parallel shards driven by select_local_tests.py, pins installs to scripts/ci-python-*.txt, adds pip and apt (.deb) caching for ffmpeg, and wires both shards into ci-required. The lightweight guard job drops to a 10-minute timeout and no longer runs the full pytest suite.

macOS Apple Silicon now boots core_runtime instead of the full Torch/WanGP stack: launch.py detects the profile and serves editors, labs, remote MiniMax/Meshy flows, and capability-gated stubs for local GPU engines. Companion routers add core labs (Story/Character Kit/Series FS APIs), core MCP (read tools; local mutations 409), core remote (production profile, music/3D jobs, Director planning reads), and series plan jobs on core.

On the full runtime, Series asset import dedupes generated references and delegates attachment to series_production; new references/refresh syncs episode refs. Bulk render start only queues shots whose production method is generated_video, with clearer errors for animation/import shots. Audio analysis can derive song structure from an aligned lyric timeline before LLM hints. Director review persists via a new router; scene packages export/import/preflight; system capabilities and user diagnostics HTTP surfaces mount; Wizard workflow executor and World3D export join MCP command catalogs.

Character kits expand the mouth manifest to nine viseme states and ship the Studio 20 collection (20 styles). 3D speech accepts JSON+wav analysis requests; face calibration can hash workspace GLBs for profile identity. LLM listing accepts an optional remote url; generate can use scoped writingProvider without loading the default local model.

Docs/handoff files (README, API.md, lane handoffs, integration patches) document MCP, Series mixed production, Tools commands, and pending merges—without replacing the product changes above.

Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.

IAnMove and others added 30 commits September 11, 2026 11:09
#339 added studio/video generation modules. --group assigns them to
python-a, but test_ci_shards still requires an exact committed partition.
#339 added studio/video generation modules. --group assigns them to
python-a, but test_ci_shards still requires an exact committed partition.
Export used Video3D media into a versioned zip, import with preflight
and picker repair, and refuse templates, cinema runtimes, zip slip and
oversized archives without touching the previous project on failure.
…tory

CI cannot install python-multipart; accept the package as a raw zip body.
Split preflight helpers so complexity stays under the ratchet, copy bytes
before SHA-256 for TypeScript, and record the new scene-package reader.
Split URL/ref/preflight helpers and extract router handlers so no
function stays at complexity 15+ and the service stays under 1200 lines.
…shes

Export looked up packed hashes with (workspace, filename, url), but slots
that only have sourceUrl were rewritten with an empty filename, so the
GLB stayed pointed at the source workspace after a "successful" import.
Also skip dest names whose .meta.json already belongs to another extension.

Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
…0 lines

The ratchet treats a new 1,253-line module as a hotspot. Move import,
reassignment and unique-name helpers to scene_packages_import.py.
…rship

Land Cursor #345/#347 on the package branch: do not treat a sibling's
sidecar as this file's hash, and keep empty companion slots on import.
List test_scene_packages.py and generation.video modules in python-a so
test_ci_shards matches the suite after rebase onto development.
Read Activity as request → child jobs → attempts → artifacts. Group by
existing intent/receipt IDs, keep selection stable across SSE/polling,
and let Wizard receipts open the exact group without a second progress source.
Extract stream, panel, compact bar and execution cards so every function
stays at eslint complexity 14 or lower. Refresh the architecture wire
inventory for the ActivityFooter store import in tests.
Activity opened details via agentUiBus and mapped targets via
executionCards. Both belong to Agent Mode; listen through uiBus and
keep the tab map local so the slice-import contract stays empty.
Add a cue timeline for source-time viseme edits and interval reanalysis,
and hash stored GLBs with a workspace SHA-256 so face profiles still save
on HTTP LAN without crypto.subtle.
Extract track, tools and cue fields so no function exceeds complexity 14,
and call reanalyze only after an explicit selection/handler guard.
CueTimeline reused the Listen aria-label and the GLB digest route was
unhandled after boot. Give playback its own copy and stub
/character-kits/speech/digest in the simulated API.
Añade explosion como SFX de mundo (destello, bola de fuego, onda,
escombros y humo tardío) y sustituye el pintor 2D genérico. Plantilla
Cinema · Ground blast.
Add an EN/ES fixture covering intents, negations, ambiguous refs,
workspace change, retry identity, compound orders and unpublished
tools. Contract tests prove refusals create no task, unpublished
generation.video cannot promise success, and HTTP/MCP retries share
one job id. Guide is for operators who do not know the code.
#339 published generation.video. The corpus now rejects generation.model3d
instead, and the Wizard refusal E2E accepts the current exclusion copy.
…20260911

feat(projects): portable scene packages with asset repair
fix(video3d): conservar el media de pantallas al aplicar un escenario
…9-5886e5916a46-7f81

fix(ui): restaurar Settings y Director fuera de Generación directa
…e-20260911

feat(activity): group jobs under request with receipts and recovery
A hard cut before xfade left concat's 1/1000000 timebase on the left
input, so FFmpeg rejected cut-then-crossfade and time-card-then-xfade
exports. Reset settb/setpts on both xfade inputs.

Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
Pin multi_prompts_gen_type=2 so newline prompts are not split by
primary_settings, and pin sliding_window_size to video_length so t2v
jobs longer than 129 frames are not skipped-then-marked-done.

Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
… video

Director hold-crossfade still failed when two 30fps clips had different
encoder timebases (1/30 vs 1/15360), so the soft join fell back to a
slap-cut. Normalize settb=AVTB before tpad/xfade.

Hard concat with a driving song mapped the raw audio and used -shortest,
so a track shorter than the clips discarded the tail of the movie.
Pad and bound the soundtrack so -shortest cannot cut pictures.

Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
#343 already owns concat 1/fps. Keep the T2V single-window pin,
literal multi-line prompts, mix_concat settb, and soundtrack padding.
Director music_video and rejoin pass audio_start_sec as atrim=start on
the track (often 12.5). The pad_audio=False bound subtracted that offset
from the clip sum, so -shortest discarded the tail of the movie.

Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
El overlay 2D deja de pintar círculos y palitos. El blast 3D usa lenguas
de fuego, anillo irregular y recorte de plano. La plantilla 3D ya no
superpone el overlay 2D.
IAnMove and others added 23 commits September 13, 2026 14:13
fix(review): keep notes when restating a stale approval
…60913

feat(studio): contextual Series production and reusable phonetic character rigs
Saving a new character used readSpeechDraft(workspace, ''), which aliases
the unscoped workshop recovery key. That could overwrite another kit with
the new name/voice and wipe the general workshop draft.

#414 landed on the Series production branch after it had already merged
into development, so the same hole was still on origin/development.

Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
fix(characters): do not treat empty kit id as the general speech draft
Require nine mouth poses and preserve lipsync through export
@IAnMove
IAnMove marked this pull request as ready for review September 14, 2026 14:39

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Scene save omits workspace URL
    • POST /api/v1/scenes now appends ?workspace= to the returned file URL so serve_file looks in the same folder the scene was written to.

Create PR

Or push these changes by commenting:

@cursor push 10a6914923
Preview (10a6914923)
diff --git a/app/core_runtime.py b/app/core_runtime.py
--- a/app/core_runtime.py
+++ b/app/core_runtime.py
@@ -522,7 +522,8 @@
     scene = body.get("scene") if isinstance(body, dict) else None
     if not isinstance(scene, dict):
         raise HTTPException(status_code=400, detail="A version 1 scene is required")
-    folder = core.workspace_dir(body.get("workspace") if isinstance(body, dict) else None)
+    workspace = body.get("workspace") if isinstance(body, dict) else None
+    folder = core.workspace_dir(workspace)
     os.makedirs(folder, exist_ok=True)
     import json
     import time
@@ -532,7 +533,8 @@
     Path_write = path
     with open(Path_write, "w", encoding="utf-8") as handle:
         json.dump(scene, handle)
-    return {"name": name, "type": "scene", "url": f"/api/v1/file/{name}"}
+    suffix = f"?workspace={workspace}" if workspace else ""
+    return {"name": name, "type": "scene", "url": f"/api/v1/file/{name}{suffix}"}
 
 
 @api.post("/api/v1/video-editor/probe")

You can send follow-ups to the cloud agent here.

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.

Comment thread app/core_runtime.py Outdated
Path_write = path
with open(Path_write, "w", encoding="utf-8") as handle:
json.dump(scene, handle)
return {"name": name, "type": "scene", "url": f"/api/v1/file/{name}"}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scene save omits workspace URL

Medium Severity

save_scene writes the document into the requested workspace but returns /api/v1/file/{name} with no workspace query. serve_file then resolves the file against the active or default folder, so a scene saved outside that folder is not reachable from the returned URL.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.

Comment thread H07_HANDOFF.md Outdated
```

Cache dir: `SPEECH_ANALYSIS_CACHE_DIR` or `cache/speech-analysis/` (gitignored).
Limits: `SPEECH_ANALYSIS_CACHE_MAX_BYTES` (128 MiB), `SPEECH_ANALYSIS_CACHE_MAX_ENTRIES` (64).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agent handoff files committed

Low Severity

Temporary agent notes were added at the repo root, including local machine paths, “do not merge” instructions, and a pending launch-runtime patch. These are working artifacts, not product documentation, and can be mistaken for apply-ready integration steps.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.

Fix release CI ratchet and Bugbot integration findings
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants